# !/usr/bin/python
# -*- coding: utf-8 -*-
'''
@File    :   lengthOfLongestSubstring.py
@Time    :   2021/04/14 23:03:33
@Author  :   Qingxiang Zhang
@Version :   1.0
@Contact :   344285081@qq.com
@Desc    :   无重复字符的最长子串
@Software:    Vscode
给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
     请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
示例 4:
输入: s = ""
输出: 0
 
提示：
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
'''
class Solution():
    def lengthOfLongestSubstring(self, s: str) -> int:
        start = -1
        maxd =0
        dict ={}
        for i in range(len(s)):
        # 产生字典，在的话就判断，不在的话就不在判断
            if s[i] in dict and dict[s[i]]>start:
                start = dict[s[i]]
                dict[s[i]] =i
            else:
                dict[s[i]] = i
                if (i -start) > maxd:
                    maxd = i-start
        return maxd


    def lengthOfLongestSubstring(self, s: str) -> int:
        left = 0
        right = 0 
        window = dict()
        ans = 0
        while right < len(s):
            if s[right] not in window:
                window[s[right]] = 1
            else:
                window[s[right]] += 1
            
            while window[s[right]] > 1:
                window[s[left]] -= 1
                left += 1
            
            ans = max(ans, right - left +1)

            right += 1
        return ans



if __name__=="__main__":
    solu=Solution()
    s="bbbb"
    max=solu.lengthOfLongestSubstring("bbbbb")
    print(max)
    max=solu.lengthOfLongestSubstring(s)
    print(max)
